import { dbService } from './dbService';

/**
 * 导出和导入服务 - 用于从IndexedDB导出数据和导入数据
 */
export const exportService = {
  /**
   * 导出用户信息
   * @returns {Promise<Object>} 用户信息数据
   */
  async exportUserData() {
    try {
      const userData = await dbService.get(dbService.getStoreNames().USER, 'currentUser');
      return userData || {};
    } catch (error) {
      console.error('导出用户数据失败:', error);
      throw error;
    }
  },

  /**
   * 导出联系人列表
   * @returns {Promise<Object>} 联系人数据
   */
  async exportContacts() {
    try {
      const contactsRecord = await dbService.get(dbService.getStoreNames().CONTACTS, 'contacts');
      return contactsRecord?.data || {};
    } catch (error) {
      console.error('导出联系人数据失败:', error);
      throw error;
    }
  },

  /**
   * 导出通讯录
   * @returns {Promise<Array>} 通讯录数据
   */
  async exportAddressBook() {
    try {
      const addressBookData = await dbService.getAll(dbService.getStoreNames().ADRESSBOOK);
      return addressBookData || [];
    } catch (error) {
      console.error('导出通讯录数据失败:', error);
      throw error;
    }
  },

  /**
   * 导出聊天记录
   * @returns {Promise<Array>} 聊天记录数据
   */
  async exportMessages() {
    try {
      const messagesData = await dbService.get(dbService.getStoreNames().MESSAGES, 'allMessages');
      return messagesData?.data || {};
    } catch (error) {
      console.error('导出聊天记录失败:', error);
      throw error;
    }
  },

  /**
   * 导出所有数据
   * @returns {Promise<Object>} 包含所有数据的对象
   */
  async exportAllData() {
    try {
      const userData = await this.exportUserData();
      const contacts = await this.exportContacts();
      const addressBook = await this.exportAddressBook();
      const messages = await this.exportMessages();

      return {
        userData,
        contacts,
        addressBook,
        messages,
        exportDate: new Date().toISOString()
      };
    } catch (error) {
      console.error('导出所有数据失败:', error);
      throw error;
    }
  },

  /**
   * 将数据导出为JSON文件并下载
   * @param {Object} data 要导出的数据
   * @param {string} fileName 文件名
   */
  downloadAsJson(data, fileName = 'mechat-export.json') {
    try {
      const jsonString = JSON.stringify(data, null, 2);
      const blob = new Blob([jsonString], { type: 'application/json' });
      const url = URL.createObjectURL(blob);
      
      const a = document.createElement('a');
      a.href = url;
      a.download = fileName;
      document.body.appendChild(a);
      a.click();
      
      // 清理
      setTimeout(() => {
        document.body.removeChild(a);
        URL.revokeObjectURL(url);
      }, 100);
    } catch (error) {
      console.error('下载JSON文件失败:', error);
      throw error;
    }
  }
};

/**
 * 导入服务 - 用于导入数据到IndexedDB
 */
export const importService = {
  /**
   * 读取文件为文本
   * @param {File} file 要读取的文件
   * @returns {Promise<string>} 文件内容
   */
  readFileAsText(file) {
    return new Promise((resolve, reject) => {
      const reader = new FileReader();
      reader.onload = (e) => resolve(e.target.result);
      reader.onerror = () => reject(new Error('读取文件失败'));
      reader.readAsText(file);
    });
  },

  /**
   * 验证导入数据格式
   * @param {Object} data 要验证的数据
   * @returns {boolean} 是否有效
   */
  validateImportData(data) {
    // 简单验证，确保至少有一个有效的数据部分
    return data && (
      data.userData || 
      data.contacts || 
      data.addressBook || 
      data.messages
    );
  },

  /**
   * 导入数据到IndexedDB
   * @param {Object} data 要导入的数据
   * @param {Function} updateCurrentUser 更新当前用户的回调函数
   * @param {Function} updateContacts 更新联系人的回调函数
   * @returns {Promise<void>}
   */
  async importDataToDb(data, updateCurrentUser, updateContacts) {
    // 导入用户数据
    if (data.userData) {
      await dbService.set(dbService.getStoreNames().USER, data.userData);
      if (updateCurrentUser) {
        updateCurrentUser(data.userData);
      }
    }
    
    // 导入联系人数据
    if (data.contacts) {
      await dbService.set(dbService.getStoreNames().CONTACTS, { id: 'contacts', data: data.contacts });
      if (updateContacts) {
        updateContacts(data.contacts);
      }
    }
    
    // 导入通讯录数据
    if (data.addressBook) {
      await dbService.set(dbService.getStoreNames().ADRESSBOOK, { id: 'addressbook', data: data.addressBook[0].data });
    }
    
    // 导入消息数据
    if (data.messages) {
      await dbService.set(dbService.getStoreNames().MESSAGES, { id: 'allMessages', data: data.messages});
    }
  },

  /**
   * 处理文件导入
   * @param {File} file 要导入的文件
   * @param {Function} updateCurrentUser 更新当前用户的回调函数
   * @param {Function} updateContacts 更新联系人的回调函数
   * @returns {Promise<void>}
   */
  async importFile(file, updateCurrentUser, updateContacts) {
    if (!file) throw new Error('未选择文件');
    
    // 读取文件内容
    const fileContent = await this.readFileAsText(file);
    const importData = JSON.parse(fileContent);
    
    // 验证导入数据格式
    if (!this.validateImportData(importData)) {
      throw new Error('导入数据格式不正确');
    }
    
    // 导入数据到IndexedDB
    await this.importDataToDb(importData, updateCurrentUser, updateContacts);
  }
};